// using System.Collections;
// using System.Collections.Generic;
// using UnityEngine;
// using UnityEngine.UI;
// using System.IO;
// // using TMPro;
// using AppTableUtils;
// using System.Data;

// using OfficeOpenXml;
// using System;
// using System.Linq;
// using System.Text;


// public class CreateImg : MonoBehaviour
// {
//     // 点击按钮, 增加一个slot
//     public GameObject slot_prefab;
//     // public slot slot_prefab;
//     public GameObject slotGrid;
//     string bag_fpath = BdUtils.join(BdUtils.data_table_dir_path, "背包物品.xls");
//     string item_fpath = BdUtils.join(BdUtils.data_table_dir_path, "物品清单.xls");
//     public DataTable bag_dt;
//     public DataTable item_dt;


//     GameObject item_description_obj;  // bag下方的描述文本
//     public Text item_description_comp;  // bag下方的描述文本

//     public GameObject guard_slot;  // 交换slot的哨兵
//     public Vector3 original_guard_slot_position;

//     Dictionary<string, GameObject> prefab_obj_dc = new Dictionary<string, GameObject>();

//     void Awake()
//     {
//         bag_dt = TableUtils.read_excel(bag_fpath, primary_key: 0);
//         item_dt = TableUtils.read_excel(item_fpath, primary_key: 0);
//         // TableUtils.show_data_table(bag_dt);
//         TableUtils.show_data_table(item_dt);

//         guard_slot = GameObject.Find("/Canvas/btns/guard_slot");
//         original_guard_slot_position = guard_slot.transform.position;
//         guard_slot.GetComponent<CanvasGroup>().blocksRaycasts = false;
//         // BdUtils.log("bag_dt --- ", bag_dt.Select("格子位置 = '10'"));

//         item_description_obj = GameObject.Find("/Canvas/Bag/bottom/item_description");
//         item_description_comp = item_description_obj.GetComponent<Text>();

//         // clear_slot_grid();
//         refresh_slot_grid();
//     }
//     public string get_discription_text_by_slot_index(int slot_index)
//     {
//         var row_i = get_row_i(slot_index);
//         if (row_i == null)
//             return "";
//         // get_slot_info_by_row_i
//         var dc_i = TableUtils.conv_row_to_dc<int>(row_i);
//         int item_id = dc_i["物品ID"];
//         // int item_id = (int)row_i["物品ID"];

//         var item_row = TableUtils.get(item_dt, pk: item_id);
//         var item_info = TableUtils.conv_row_to_dc(item_row);
//         // BdUtils.log(i, " --- dc_i --- ", dc_i, "--- item_info", item_info);

//         string item_description = item_info["介绍"].ToString();
//         // var row_i = TableUtils.get(bag_dt, select: $"格子位置 = '{slot_index}'");
//         return item_description;
//     }
//     void Start()
//     {
//     }

//     public void clear_slot_grid()
//     {

//         // BdUtils.log("*** clear_slot_grid!");

//         // item_description_comp.text = "";

//         var instance = this;
//         for (int i = 0; i < instance.slotGrid.transform.childCount; i++)
//         {
//             if (instance.slotGrid.transform.childCount == 0)
//                 break;
//             Destroy(instance.slotGrid.transform.GetChild(i).gameObject);
//         }
//         // BdUtils.TimeUtils.sleep(1);
//     }

//     // int item_number = 1;

//     public int bag_capacity = 6 * 3;

//     public Sprite load_sprite(string img_dir_path, string img_file_name, bool is_prefab = false)
//     {
//         Sprite sprite = null;
//         string FileName = Path.GetFileNameWithoutExtension(img_file_name);
//         string relative_file_path = Path.Combine(img_dir_path, FileName);

//         // string FileName = Path.GetFileName(vFileName);
//         // GameObject Object = new GameObject();
//         // Object.AddComponent<SpriteRenderer>();
//         // SpriteRenderer SpriteRender = Object.GetComponent<SpriteRenderer>();
//         // SpriteRender.name = relative_file_path;

//         // string start_ss = BdUtils.resourcesPath;
//         // img_dir_path.StartsWith(start_ss)

//         if (!is_prefab)
//         {
//             Texture2D Picture = Resources.Load<Texture2D>(relative_file_path);
//             BdUtils.assert(!BdUtils.is_null(Picture), "picture不能为空");

//             Rect Size = new Rect(0, 0, Picture.width, Picture.height);
//             // Rect Size = new Rect(0, 0, 500, 1000);
//             Vector2 Pivot = new Vector2(0, 0);
//             sprite = Sprite.Create(Picture, Size, Pivot);
//         }
//         else
//         {
//             GameObject obj_i;
//             if (!prefab_obj_dc.ContainsKey(relative_file_path))
//             {
//                 obj_i = Resources.Load<GameObject>(relative_file_path);
//                 // Instantiate(obj_i, new Vector3(100f, 100f, 100f), Quaternion.identity);
//                 Instantiate(obj_i);
//                 prefab_obj_dc.Add(relative_file_path, obj_i);
//             }
//             else
//             {
//                 obj_i = prefab_obj_dc[relative_file_path];
//             }

//             // new_item_obj = Instantiate(slot_prefab, slotGrid.transform.position, Quaternion.identity);
//             SpriteRenderer sprite_renderer = obj_i.GetComponent<SpriteRenderer>();
//             sprite = sprite_renderer.sprite;
//         }
//         return sprite;
//     }

//     string prefab_dir_path = BdUtils.join("inventory", "prefabs");
//     string items_dir_path = BdUtils.join("inventory", "items");


//     public void save_bag_dt()
//     {
//         // --- 保存存档
//         BdUtils.log(" --- bag_dt.TableName: ", bag_dt.TableName);
//         TableUtils.save_to(bag_dt, bag_dt.TableName);

//         // --- 新存档
//         // string new_path = Path.Combine(Path.GetDirectoryName(bag_dt.TableName), Path.GetFileNameWithoutExtension(bag_dt.TableName) + "_1" + Path.GetExtension(bag_dt.TableName));
//         // BdUtils.log(" --- new_path: ", new_path);
//         // TableUtils.save_to(bag_dt, new_path);
//     }

//     public void set_one_slot(GameObject new_item_obj, string img_file_name = "", int item_number = 0, bool is_prefab = false, string slot_name = "", int slot_index = -1)
//     {
//         // BdUtils.log($"new_item_obj --- {new_item_obj.name} -> {slot_name}");
//         new_item_obj.name = slot_name != "" ? slot_name : $"slot_{img_file_name}";
//         // new_item_obj.name = slot_name;

//         // --- 设置数量
//         GameObject new_item__text = new_item_obj.transform.Find("number").gameObject;  // TMP_Text
//         Text text_component = new_item__text.GetComponent<Text>();

//         // --- 设置slot图片
//         Image new_item__img = new_item_obj.GetComponent<Image>();

//         if (item_number != 0)
//         {
//             text_component.text = $"{item_number}";

//             if (img_file_name != "")
//             {
//                 string img_dir_path = is_prefab ? prefab_dir_path : items_dir_path;
//                 Sprite lihua_obj__sprite = load_sprite(img_dir_path, img_file_name, is_prefab: is_prefab);
//                 new_item__img.sprite = lihua_obj__sprite;

//                 new_item__img.color = new Color32(255, 255, 255, 255);
//             }
//         }
//         else
//         {
//             text_component.text = "";
//             new_item__img.color = new Color32(255, 255, 255, 0);
//         }

//         // --- 设置位置
//         if (slot_index == -1)
//             new_item_obj.gameObject.transform.SetParent(slotGrid.transform, false);

//         // BdUtils.log("prent --- ", new_item_obj.gameObject.transform.parent);
//     }

//     public void set_one_slot(string img_file_name = "", int item_number = 0, bool is_prefab = false, string slot_name = "", int slot_index = -1)
//     {

//         GameObject new_item_obj;
//         if (slot_index == -1)
//         {
//             // --- 初始化
//             new_item_obj = Instantiate(slot_prefab, slotGrid.transform.position, Quaternion.identity);
//         }
//         else
//         {
//             // BdUtils.log(slot_index, $" --- img_file_name: {img_file_name}, item_number: {item_number}, is_prefab: {is_prefab}, slot_name: {slot_name} ");

//             // if (slot_index >= bag_capacity)
//             //     throw new UnityException($" *** slot_index[{slot_index}]取值错误! bag的最大容量为[{bag_capacity}]!");

//             BdUtils.assert(slot_index < bag_capacity, $" *** slot_index[{slot_index}]取值错误! bag的最大容量为[{bag_capacity}]!");

//             try
//             {
//                 new_item_obj = slotGrid.transform.GetChild(slot_index).gameObject;
//                 // new_item_obj = slotGrid.transform.GetChild(slot_index + 1).gameObject;
//             }
//             catch (DataException e)
//             {
//                 throw new UnityException($" *** slot_index[{slot_index}]取值错误! e:{e}");
//             }

//         }
//         set_one_slot(new_item_obj, img_file_name, item_number, is_prefab, slot_name, slot_index);
//     }

//     public void swap_slot(int slot_index_1, int slot_index_2)
//     {
//         BdUtils.assert(slot_index_1 < bag_capacity, $" *** slot_index_1[{slot_index_1}]取值错误! bag的最大容量为[{bag_capacity}]!");
//         BdUtils.assert(slot_index_2 < bag_capacity, $" *** slot_index_2[{slot_index_2}]取值错误! bag的最大容量为[{bag_capacity}]!");

//         GameObject slot_obj_1 = slotGrid.transform.GetChild(slot_index_1).gameObject;
//         GameObject slot_obj_2 = slotGrid.transform.GetChild(slot_index_2).gameObject;

//         // slot_obj_1.name
//         // var row_1 = TableUtils.get(bag_dt, )
//         var row_1 = get_row_i(slot_index_1);

//         BdUtils.assert(row_1 != null, $" *** row_1[{row_1}]不能为`null`!");


//         var row_2 = get_row_i(slot_index_2);

//         string img_file_name;
//         int item_number;
//         bool is_prefab;
//         (img_file_name, item_number, is_prefab) = get_slot_info_by_row_i(row_1);

//         row_1["格子位置"] = slot_index_2;

//         if (row_2 != null)
//             row_2["格子位置"] = slot_index_1;

//         refresh_slot_grid();
//     }
//     public (string, int, bool) get_slot_info_by_row_i(DataRow row_i)
//     {
//         //     string img_file_name;
//         //     int item_number;
//         //     bool is_prefab;

//         var dc_i = TableUtils.conv_row_to_dc<int>(row_i);
//         int item_id = dc_i["物品ID"];

//         var item_row = TableUtils.get(item_dt, pk: item_id);

//         var item_info = TableUtils.conv_row_to_dc(item_row);
//         // BdUtils.log(i, " --- dc_i --- ", dc_i, "--- item_info", item_info);


//         string img_file_name = item_info["图片"].ToString();
//         int item_number = (int)BdUtils.conv_to_int(dc_i["数量"]);

//         var _is_prefab = item_info["预制体"];
//         bool is_prefab = BdUtils.conv_to_bool(_is_prefab);

//         img_file_name = is_prefab ? _is_prefab.ToString() : img_file_name;

//         // string item_description = item_info["介绍"].ToString();

//         // img_file_name, item_number, is_prefab
//         return (img_file_name, item_number, is_prefab);
//     }

//     public DataRow get_row_i(int slot_index)
//     {
//         var row_i = TableUtils.get(bag_dt, select: $"格子位置 = '{slot_index}'");
//         return row_i;
//     }
//     public void refresh_slot_grid()
//     {
//         clear_slot_grid();
//         // for (var i = 0; i < bag_capacity; i++)
//         // {
//         //     set_one_slot(slot_name: $"empty_{i}");
//         // }
//         // BdUtils.TimeUtils.sleep(0.1);

//         // for (var i = 0; i < bag_capacity; i++)
//         // {
//         //     var row_i = TableUtils.get(bag_dt, select: $"格子位置 = '{i}'");

//         //     if (row_i == null)
//         //     {
//         //         continue;
//         //     }
//         //     // var dc_i = TableUtils.conv_row_to_dc<int>(row_i);
//         //     // int item_id = dc_i["物品ID"];

//         //     // var item_row = TableUtils.get(item_dt, pk: item_id);

//         //     // var item_info = TableUtils.conv_row_to_dc(item_row);
//         //     // // BdUtils.log(i, " --- dc_i --- ", dc_i, "--- item_info", item_info);


//         //     // string img_file_name = item_info["图片"].ToString();
//         //     // int item_number = (int)BdUtils.conv_to_int(dc_i["数量"]);

//         //     // var _is_prefab = item_info["预制体"];
//         //     // bool is_prefab = BdUtils.conv_to_bool(_is_prefab);

//         //     // img_file_name = is_prefab ? _is_prefab.ToString() : img_file_name;

//         //     // // string slot_name = $"slot_{img_file_name}";
//         //     BdUtils.log($"i: row_{i} --- ", TableUtils.conv_row_to_dc(row_i));

//         //     string slot_name = $"slot_{i}";
//         //     var (img_file_name, item_number, is_prefab) = get_slot_info_by_row_i(row_i);
//         //     set_one_slot(img_file_name, item_number, is_prefab, slot_name: slot_name, slot_index: i);
//         // }

//         for (var i = 0; i < bag_capacity; i++)
//         {
//             // var row_i = TableUtils.get(bag_dt, select: $"格子位置 = '{i}'");
//             var row_i = get_row_i(i);
//             if (row_i == null)
//             {
//                 set_one_slot(slot_name: $"empty_{i}");
//             }
//             else
//             {
//                 // // var dc = TableUtils.conv_row_to_dc(row);
//                 // // BdUtils.log(i, " --- select --- ", row, "dc --- ", dc);

//                 // // var row_i = bag_dt.Rows[i];
//                 // var dc_i = TableUtils.conv_row_to_dc<int>(row_i);
//                 // int item_id = dc_i["物品ID"];

//                 // var item_row = TableUtils.get(item_dt, pk: item_id);

//                 // var item_info = TableUtils.conv_row_to_dc(item_row);
//                 // // BdUtils.log(i, " --- dc_i --- ", dc_i, "--- item_info", item_info);


//                 // string img_file_name = item_info["图片"].ToString();
//                 // int item_number = (int)BdUtils.conv_to_int(dc_i["数量"]);

//                 // var _is_prefab = item_info["预制体"];
//                 // bool is_prefab = BdUtils.conv_to_bool(_is_prefab);

//                 // img_file_name = is_prefab ? _is_prefab.ToString() : img_file_name;

//                 // // BdUtils.log(BdUtils.get_type(_is_prefab), $"--- _is_prefab: [{_is_prefab}]");
//                 // // BdUtils.log(i, " --- img_file_name:", img_file_name, ", item_number", item_number, ", is_prefab", is_prefab);

//                 string slot_name = $"slot_{i}";
//                 var (img_file_name, item_number, is_prefab) = get_slot_info_by_row_i(row_i);
//                 set_one_slot(img_file_name, item_number, is_prefab, slot_name: slot_name);
//             }
//         }

//     }

//     public GameObject findPNG(string dir_name, string vFileName)
//     {
//         GameObject obj = null;
//         // string Path = BdUtils.join(BdUtils.streamingAssetsPath, "data", vFileName);
//         // string Path = BdUtils.join(BdUtils.base_resource_dir_path, "data", vFileName);

//         string abs_path = BdUtils.join("Assets", "Resources", dir_name, vFileName);
//         // string abs_path = BdUtils.join("Assets", "Resources", vFileName);
//         // string Path = "Assets\\Resources\\" + vFileName;
//         if (File.Exists(abs_path))
//         {
//             // BdUtils.log(" --- img is exist, Path:", abs_path);
//             obj = createSprite(dir_name, vFileName);
//         }
//         else
//         {
//             string msg = $" ~~~ img not exist, Path: {abs_path}";
//             BdUtils.assert(0, msg);
//         }

//         return obj;
//     }
//     public GameObject createSprite(string dir_name, string vFileName)
//     {
//         string FileName = Path.GetFileNameWithoutExtension(vFileName);
//         string relative_file_path = Path.Combine(dir_name, FileName);

//         // string FileName = Path.GetFileName(vFileName);
//         GameObject Object = new GameObject();
//         Object.AddComponent<SpriteRenderer>();
//         SpriteRenderer SpriteRender = Object.GetComponent<SpriteRenderer>();
//         SpriteRender.name = relative_file_path;

//         Texture2D Picture = Resources.Load<Texture2D>(relative_file_path);
//         BdUtils.assert(!BdUtils.is_null(Picture), "picture不能为空");
//         Rect Size = new Rect(0, 0, Picture.width, Picture.height);
//         // Rect Size = new Rect(0, 0, 500, 1000);
//         Vector2 Pivot = new Vector2(0, 0);
//         Sprite sprite = Sprite.Create(Picture, Size, Pivot);

//         // var sprite = LoadByIo(vFileName);
//         SpriteRender.sprite = sprite;

//         SpriteRender.color = new Color32(100, 100, 100, 255);
//         // SpriteRender.color = new Color(152f, 152f, 152f, 100f);
//         // SpriteRender.color = new Color(152f, 152f, 152f, 100f);
//         // SpriteRender.color = Color.red;
//         // SpriteRender.color = Color.white;
//         // SpriteRender.material.color = Color.red;

//         //需要修改
//         Object.transform.position = new Vector3(0, 0, 0);
//         Object.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
//         // Object.AddComponent<ChangeState>();

//         return Object;
//     }
//     /// <summary>
//     /// 以IO方式进行加载
//     /// https://www.cnblogs.com/zqiang0803/p/13066301.html
//     /// </summary>
//     private Sprite LoadByIo(string url, int width = 300, int height = 372)
//     {
//         double startTime = (double)Time.time;
//         //创建文件读取流
//         FileStream fileStream = new FileStream(url, FileMode.Open, FileAccess.Read);
//         //创建文件长度缓冲区
//         byte[] bytes = new byte[fileStream.Length];
//         //读取文件
//         fileStream.Read(bytes, 0, (int)fileStream.Length);

//         //释放文件读取流
//         fileStream.Close();
//         //释放本机屏幕资源
//         fileStream.Dispose();
//         fileStream = null;

//         //创建Texture
//         // int width = 300;
//         // int height = 372;
//         Texture2D texture = new Texture2D(width, height);
//         texture.LoadImage(bytes);

//         //创建Sprite
//         Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
//         // image.sprite = sprite;

//         startTime = (double)Time.time - startTime;
//         // Debug.Log("IO加载" + startTime);

//         return sprite;

//     }
// }
